package main

// 283.移动0
func main() {
	//nums := []int{0, 3, 7, 2, 5, 8, 4, 6, 0, 1}
	nums := []int{9, 1, 4, 0, 3, -1, 0, 5, 8, -1, 6}
	//nums := []int{0, 0, 1}
	moveZero(nums)
	for _, num := range nums {
		println(num)
	}
}

func moveZero(nums []int) { // 官方解法
	left, right, n := 0, 0, len(nums)
	for right < n {
		if nums[right] != 0 {
			nums[left], nums[right] = nums[right], nums[left]
			left++
		}
		right++
	}
}

//func moveZero(nums []int) { // 执行速度不妙
//	endPoint := 0   // 尾指针寻找非0
//	startPoint := 0 // 首指针找0
//	for endPoint < len(nums) {
//		if nums[startPoint] == 0 {
//			endPoint = startPoint
//			for nums[endPoint] == 0 {
//				endPoint++
//				if endPoint > len(nums)-1 { // 超出边界
//					return
//				}
//			}
//			nums[startPoint] = nums[endPoint]
//			nums[endPoint] = 0
//		}
//		startPoint++
//		endPoint++
//	}
//}

//func moveZero(nums []int) {
//	endPoint := 0
//	startPoint := 0
//	for startPoint < endPoint {
//		if nums[startPoint] == 0 && nums[endPoint] != 0 {
//			swapTwoNum(nums, startPoint, endPoint)
//			endPoint--
//		} else if nums[startPoint] == 0 && nums[endPoint] == 0 {
//			endPoint--
//		} else {
//			startPoint++
//		}
//	}
//}

func swapTwoNum(nums []int, s int, e int) {
	if s < 0 || s >= len(nums) || e < 0 || e >= len(nums) {
		return
	}
	a := nums[s]
	nums[s] = nums[e]
	nums[e] = a
	return
}

//给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
//
//请注意 ，必须在不复制数组的情况下原地对数组进行操作。
//
//
//
//示例 1:
//
//输入: nums = [0,1,0,3,12]
//输出: [1,3,12,0,0]
//示例 2:
//
//输入: nums = [0]
//输出: [0]
//
//
//提示:
//
//1 <= nums.length <= 104
//-231 <= nums[i] <= 231 - 1
